"""日志全局统一配置模块"""

import logging
from logging.handlers import RotatingFileHandler
import os
import sys
from typing import Optional

from config.sys_config import get_settings

# 获取配置
settings = get_settings()

# 默认日志格式
DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

# 默认日期格式
DEFAULT_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

# 日志级别映射表
LOG_LEVEL_MAPPING = {
    'DEBUG': logging.DEBUG,
    'INFO': logging.INFO,
    'WARNING': logging.WARNING,
    'WARN': logging.WARNING,
    'ERROR': logging.ERROR,
    'CRITICAL': logging.CRITICAL,
    'FATAL': logging.CRITICAL
}

# 确保日志目录存在
def ensure_log_dir(log_dir: str) -> None:
    """确保日志目录存在，如果不存在则创建"""
    if not os.path.exists(log_dir):
        os.makedirs(log_dir, exist_ok=True)


def setup_logger(
    name: Optional[str] = None,
    log_format: str = DEFAULT_LOG_FORMAT,
    date_format: str = DEFAULT_DATE_FORMAT,
    max_bytes: int = 5 * 1024 * 1024,  # 5MB
    backup_count: int = 5
) -> logging.Logger:
    """
    设置全局统一的日志配置
    
    Args:
        name: 日志器名称，None表示使用root logger
        log_level: 日志级别，None表示使用配置文件中的LOG_LEVEL
        log_file: 日志文件路径，None表示使用配置文件中的LOG_FILE
        log_format: 日志格式
        date_format: 日期格式
        max_bytes: 日志文件最大字节数，超过后会自动分割
        backup_count: 保留的备份文件数量
        
    Returns:
        logging.Logger: 配置好的日志器实例
    """
    # 获取或创建日志器
    logger = logging.getLogger(name)
    
    # 使用配置的日志级别
    level_str = settings.LOG_LEVEL
    numeric_level = LOG_LEVEL_MAPPING.get(level_str.upper(), logging.INFO)
    logger.setLevel(numeric_level)
    
    # 避免重复添加处理器
    if logger.handlers:
        return logger
    
    # 创建格式化器
    formatter = logging.Formatter(log_format, datefmt=date_format)
    
    # 根据环境变量决定是否添加控制台处理器
    if settings.LOG_TO_CONSOLE:
        # 创建控制台处理器
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)
    
    # 根据环境变量决定是否添加文件处理器
    if settings.LOG_TO_FILE:
        # 确保日志目录存在
        ensure_log_dir(settings.LOG_DIR)
        # 组合日志目录和文件名
        log_file_path = os.path.join(settings.LOG_DIR, settings.LOG_FILE)
            
        # 创建RotatingFileHandler，支持日志文件分割
        file_handler = RotatingFileHandler(
            log_file_path,
            maxBytes=max_bytes,
            backupCount=backup_count,
            encoding='utf-8'
        )
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    return logger


# 创建全局默认日志器
def get_default_logger(name: Optional[str] = None) -> logging.Logger:
    """
    获取默认配置的日志器
    
    Args:
        name: 日志器名称，None表示使用root logger
        
    Returns:
        logging.Logger: 默认配置的日志器实例
    """
    return setup_logger(name)


# 方便使用的日志级别快捷函数
def debug(logger: logging.Logger, msg: str, *args, **kwargs) -> None:
    """记录调试信息"""
    logger.debug(msg, *args, **kwargs)


def info(logger: logging.Logger, msg: str, *args, **kwargs) -> None:
    """记录一般信息"""
    logger.info(msg, *args, **kwargs)


def warning(logger: logging.Logger, msg: str, *args, **kwargs) -> None:
    """记录警告信息"""
    logger.warning(msg, *args, **kwargs)


def error(logger: logging.Logger, msg: str, *args, **kwargs) -> None:
    """记录错误信息"""
    logger.error(msg, *args, **kwargs)


def critical(logger: logging.Logger, msg: str, *args, **kwargs) -> None:
    """记录严重错误信息"""
    logger.critical(msg, *args, **kwargs)


# 将日志配置函数导出到包级别
__all__ = [
    'setup_logger',
    'get_default_logger',
    'debug',
    'info',
    'warning',
    'error',
    'critical'
]